为NEMU添加指令时发现不仅有DIV指令还有DIVU指令,翻阅RISC-V手册找到如下描述:
Pasted image 20240404201020.png
两者都是整数除法指令,结果向零取整,区别在于DIV是有符号除法而DIVU是无符号除法。
那么所谓的无符号除法究竟是什么除法,与有符号除法相比,我们在硬件上还需要做什么?类似的问题还有slti和sltiu:
Pasted image 20240404202226.png
sltiu很容易理解,immediate符号位扩展后仍然被当做无符号数,即硬件上直接与src1比较即可,那么slti指令中所谓的将immediate视为补码指的是什么意思,硬件上需要对数据做特殊处理吗?
查阅了许多资料,找到第一个重要线索“该指令包括有符号版本(slt)和无符号版本(sltu),分别用于有符号和无符号整数的比较。”这意味着有符号指令和无符号指令面向的对象不同,有符号指令得保证有符号数运算的正确性。

结论

针对无符号数和有符号数的操作,硬件上是需要做相应更改的。例如有符号右移做的是算术右移,意味着最左侧要补数值的最高位(符号位),而无符号右移需要补零。
总之,两类操作并是由软件进行协调,实际上是需要硬件支持的,有符号运算调用有符号运算专用的硬件。
尝试编写以下代码

#include <stdint.h>
int32_t fun1(int32_t a, int32_t b) { return a + b; }
uint32_t fun2(uint32_t a, uint32_t b) { return a + b; }

查看反汇编:

Disassembly of section .text:
00000000 <fun1>:
   0:   00b50533                add     a0,a0,a1
   4:   00008067                ret
00000008 <fun2>:
   8:   00b50533                add     a0,a0,a1
   c:   00008067                ret